#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ti[55];  // 每辆火车行驶一站的时间
// has_train[t][i][0]：在t时刻i车站是否有向右的火车
bool has_train[2005][55][2];
// dp[i][j]：在i时刻，你在车站j最少还需要等待多长时间
int dp[2055][55];
int main() {
  int tc = 0;
  int n;
  while (cin >> n && n) {
    int t;
    cin >> t;
    memset(has_train, 0, sizeof(has_train));
    for (int i = 1; i <= n - 1; ++i) {
      cin >> ti[i];
    }
    int m1;
    cin >> m1;
    for (int i = 0; i < m1; ++i) {
      // rightward
      int d;
      cin >> d;
      for (int j = 1; j <= n; ++j) {
        if (d > t) break;
        has_train[d][j][0] = true;
        d += ti[j];
      }
    }
    int m2;
    cin >> m2;
    for (int i = 0; i < m2; ++i) {
      // leftward
      int e;
      cin >> e;
      for (int j = n; j >= 1; --j) {
        if (e > t) break;
        has_train[e][j][1] = true;
        e += ti[j - 1];  // leftward
      }
    }
    for (int j = 0; j < n; ++j) dp[t][j] = 5000;
    dp[t][n] = 0;
    for (int i = t - 1; i >= 0; --i) {
      for (int j = 1; j <= n; ++j) {
        // 一共有三种转移
        // 1. 在原地等一分钟
        dp[i][j] = dp[i + 1][j] + 1;
        // 2. 乘坐向右的火车而来
        if (j < n && i + ti[j] <= t && has_train[i][j][0]) {
          dp[i][j] = min(dp[i][j], dp[i + ti[j]][j + 1]);
        }
        // 3. 乘坐向左的火车而来
        if (j > 1 && i + ti[j - 1] <= t && has_train[i][j][1]) {
          dp[i][j] = min(dp[i][j], dp[i + ti[j - 1]][j - 1]);
        }
      }
    }
    printf("Case Number %d: ", ++tc);
    if (dp[0][1] >= 5000)
      printf("impossible\n");
    else
      printf("%d\n", dp[0][1]);
  }
}
